package com.cloudsea.yunhaiutils.common;

import lombok.Data;

import java.io.Serializable;

/**
 * 通用API响应封装类
 * <p>
 * 使用泛型 T 来适应不同类型的返回数据
 *
 * @param <T> a
 */
@Data
public class ApiResponse<T> implements Serializable {

    /**
     * 业务状态码
     * <p>
     * 例如：200 表示成功, 500 表示服务器错误, 4001 表示参数错误等
     */
    private int code;

    /**
     * 响应消息
     * <p>
     * 向用户展示的提示信息
     */
    private String message;

    /**
     * 响应数据
     * <p>
     * 接口返回的具体业务数据
     */
    private T data;

    /**
     * 私有构造函数，防止外部直接 new
     */
    private ApiResponse() {
    }

    private ApiResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // ================== 静态工厂方法 (推荐使用) ==================

    /**
     * 成功，不返回数据
     *
     * @param <T> 泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> success() {
        return new ApiResponse<>(200, "操作成功", null);
    }

    /**
     * 成功，并返回数据
     *
     * @param data 返回的数据
     * @param <T>  泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "操作成功", data);
    }

    /**
     * 成功，并返回自定义消息和数据
     *
     * @param message 自定义消息
     * @param data    返回的数据
     * @param <T>     泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> success(String message, T data) {
        return new ApiResponse<>(200, message, data);
    }

    /**
     * 失败，返回默认错误消息
     *
     * @param <T> 泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> fail() {
        return new ApiResponse<>(500, "操作失败", null);
    }

    /**
     * 失败，返回自定义错误消息
     *
     * @param message 错误消息
     * @param <T>     泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> fail(String message) {
        return new ApiResponse<>(500, message, null);
    }

    /**
     * 失败，返回指定的业务状态码和错误消息
     *
     * @param code    业务状态码
     * @param message 错误消息
     * @param <T>     泛型
     * @return ApiResponse
     */
    public static <T> ApiResponse<T> fail(int code, String message) {
        return new ApiResponse<>(code, message, null);
    }
}
